const multer = require('multer');
const path = require('path');
const fs = require('fs-extra');
const publicModelService = require('../services/publicModelService');
const fileUtils = require('../utils/fileUtils');
const config = require('../config/config');

// 配置multer存储
const storage = multer.diskStorage({
    destination: async function (req, file, cb) {
        try {
            // 确保公共模型目录存在
            const publicStoragePath = await fileUtils.ensurePublicModelStorageDir();
            cb(null, publicStoragePath);
        } catch (error) {
            cb(error);
        }
    },
    filename: function (req, file, cb) {
        // 构建文件名：时间戳 + 原始扩展名
        const fileExt = path.extname(file.originalname);
        const fileName = `public_model_${Date.now()}${fileExt}`;
        cb(null, fileName);
    }
});

// 文件过滤器
const fileFilter = (req, file, cb) => {
    const fileExt = path.extname(file.originalname).toLowerCase().substring(1);
    if (!['stl', 'obj'].includes(fileExt)) {
        return cb(new Error('不支持的文件格式，仅支持STL和OBJ格式'), false);
    }
    cb(null, true);
};

// 创建multer上传实例
const upload = multer({
    storage: storage,
    fileFilter: fileFilter,
    limits: {
        fileSize: 100 * 1024 * 1024 // 限制100MB
    }
}).single('file');

/**
 * 获取所有公共模型
 */
exports.getAllPublicModels = async (req, res) => {
    try {
        const { success, data, error } = await publicModelService.getAllPublicModels();

        if (!success) {
            return res.status(400).json({
                status: 400,
                message: error
            });
        }

        return res.json({
            status: 200,
            data
        });
    } catch (error) {
        console.error('获取公共模型列表错误:', error);
        return res.status(500).json({
            status: 500,
            message: '服务器错误'
        });
    }
};

/**
 * 上传公共模型
 */
exports.uploadPublicModel = async (req, res) => {
    try {
        upload(req, res, async function (err) {
            if (err) {
                return res.status(400).json({
                    status: 400,
                    message: err.message
                });
            }

            if (!req.file) {
                return res.status(400).json({
                    status: 400,
                    message: '请选择要上传的模型文件'
                });
            }

            const { success, data, error } = await publicModelService.uploadPublicModel(req.file, req.userId);

            if (!success) {
                return res.status(400).json({
                    status: 400,
                    message: error
                });
            }

            return res.status(201).json({
                status: 201,
                data
            });
        });
    } catch (error) {
        console.error('上传公共模型错误:', error);
        return res.status(500).json({
            status: 500,
            message: '服务器错误'
        });
    }
};

/**
 * 获取公共模型详情
 */
exports.getPublicModelById = async (req, res) => {
    try {
        const { success, data, error } = await publicModelService.getPublicModelById(req.params.modelId);

        if (!success) {
            return res.status(404).json({
                status: 404,
                message: error
            });
        }

        return res.json({
            status: 200,
            data
        });
    } catch (error) {
        console.error('获取公共模型详情错误:', error);
        return res.status(500).json({
            status: 500,
            message: '服务器错误'
        });
    }
};

/**
 * 下载公共模型
 */
exports.downloadPublicModel = async (req, res) => {
    try {
        const { success, data, error } = await publicModelService.downloadPublicModel(req.params.modelId);

        if (!success) {
            return res.status(404).json({
                status: 404,
                message: error
            });
        }

        // 设置响应头并发送文件
        res.setHeader('Content-Disposition', `attachment; filename="${encodeURIComponent(data.originalName)}"`);
        res.setHeader('Content-Type', 'application/octet-stream');
        
        return res.download(data.filePath, data.originalName);
    } catch (error) {
        console.error('下载公共模型错误:', error);
        return res.status(500).json({
            status: 500,
            message: '服务器错误'
        });
    }
};

/**
 * 获取公共模型缩略图
 */
exports.getPublicModelThumbnail = async (req, res) => {
    try {
        const { success, data, error } = await publicModelService.getPublicModelById(req.params.modelId);

        if (!success || !data.thumbnail || !data.thumbnail.path) {
            // 如果没有缩略图，返回默认图片
            return res.status(404).json({
                status: 404,
                message: '缩略图不存在'
            });
        }

        // 检查文件是否存在
        if (!await fs.pathExists(data.thumbnail.path)) {
            return res.status(404).json({
                status: 404,
                message: '缩略图文件不存在'
            });
        }

        // 发送缩略图
        return res.sendFile(data.thumbnail.path);
    } catch (error) {
        console.error('获取公共模型缩略图错误:', error);
        return res.status(500).json({
            status: 500,
            message: '服务器错误'
        });
    }
};